package com.link.base.tencent.youtu.service;

import com.link.base.tencent.youtu.model.*;
import com.link.base.tencent.youtu.model.*;

import java.util.ArrayList;
import java.util.List;

/**
 * 优图 service
 *
 * @author ouyangzhenqiang
 * @date 2018/12/29
 */
public interface YoutuService {

    /**
     * 分组控制：兼顾生成新的分组、统计分组person数量、构建分组列表
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param tempStore
     * @return 分组、分组列表
     */
    PublicAppInfo getAppGroup(Store tempStore) throws Exception;

    /**
     * 人脸检索
     * 本接口用于对一张待识别的人脸图片，在一个或多个 group 中识别出最相似的 Top5 person 作为其身份返回，返回的 Top5 中按照相似度从大到小排列
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param groupIdList group拼接字符串
     * @param imgUrl      图片访问链接
     * @param corpId
     */
    String identify(String groupIdList, String imgUrl, String corpId) throws Exception;

    /**
     * 优图-获取项目下的所有分组
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param corpId
     */
    String getgroupids(String corpId) throws Exception;

    /**
     * 优图-获取分组下的所有person
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param group_id 分组Id
     * @param corpId
     */
    String getpersonids(String group_id, String corpId) throws Exception;

    /**
     * 优图-获取person下的所有face
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param person_id person Id
     * @param corpId
     */
    String getfaceids(String person_id, String corpId) throws Exception;

    /**
     * 创建个体
     * 创建一个 person，并将 person 放置到 group_ids 指定的组当中，不存在的 group_id 会自动创建
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param groupIdList group拼接字符串
     * @param person_id
     * @param imgUrl      图片访问链接
     * @param corpId
     */
    String newperson(String groupIdList, String person_id, String imgUrl, String corpId) throws Exception;

    /**
     * 删除个体
     * 删除一个 person
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param person_id
     * @param corpId
     */
    void delperson(String person_id, String corpId) throws Exception;

    /**
     * Link创建个体
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param record
     * @param face
     * @param tempStore
     */
    String newLinkPerson(Person record, Face face, Store tempStore) throws Exception;

    /**
     * 增加人脸
     * 将一组 face 加入到一个 person 中，一个 person 最多允许包含 20 个 face
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param person_id
     * @param urls      图片访问链接
     * @param corpId
     */
    String addface(String person_id, ArrayList<String> urls, String corpId) throws Exception;

    /**
     * Link增加人脸
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param record
     * @param corpId
     */
    void addLinkFace(Face record, String corpId) throws Exception;

    /**
     * 删除人脸
     * 删除一个 person 下的 face ，包括特征、属性和 face id
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param person_id
     * @param face_ids
     * @param corpId
     */
    String delface(String person_id, ArrayList<String> face_ids, String corpId) throws Exception;

    /**
     * 设置 person 的 name
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param person_id
     * @param person_name
     * @param corpId
     */
    String setinfo(String person_id, String person_name, String corpId) throws Exception;

    /**
     * 人脸检测与分析
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param imgUrl 图片访问链接
     * @param corpId
     */
    String faceDetect(String imgUrl, String corpId) throws Exception;

    /**
     * 人脸对比
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param imgUrlA 图片访问链接
     * @param imgUrlB 图片访问链接
     * @param corpId
     */
    NormalObj faceCompare(String imgUrlA, String imgUrlB, String corpId) throws Exception;

    /**
     * 新建接待信息，包括头行结构
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param record
     * @param receptionList
     * @param tempStore
     */
    String setReception(Reception record, List<ReceptionList> receptionList, Store tempStore) throws Exception;

    /**
     * 通过接待头Id获取接待上的face信息，并构造face对象
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param receptionId 接待头Id
     */
    Face getFaceInfoByReceptionId(String receptionId) throws Exception;

    /**
     * 更新接待头信息
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param receptionId 接待头Id
     * @param userId      接待人Id
     */
    void updateReceptionById(String receptionId, Long userId) throws Exception;

    /**
     * 重置优图数据库，清空优图相关表数据、清空腾讯上项目下的所有数据
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param retainReception 是否保留接待数据，为'Y'则保留，默认不保留
     * @param tempStore
     * @throws Exception
     */
    void resetYoutu(String retainReception, Store tempStore) throws Exception;

    /**
     * 人脸验证
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param personId 对比人Id
     * @param imgUrl   对比图片
     * @param corpId
     */
    NormalObj faceVerify(String personId, String imgUrl, String corpId) throws Exception;

    /**
     * 根据base 64 code返回图片访问链接
     *
     * @author ouyangzhenqiang
     * @date 2018/12/10
     * @param code base 64 code
     */
    String getHttpUrlByCode(String code) throws Exception;

    /**
     * 获取门店基本信息，通过门店Id
     *
     * @author ouyangzhenqiang
     * @date 2018/11/29
     * @param storeId
     * @return
     * @throws Exception
     */
    Store getStoreInfoById(Long storeId) throws Exception;

    /**
     * 用户在人脸识别接待过程中，综合考虑系统匹配度&人眼识别后，不选择提供的可选客户时，需要进行个体&人脸新建
     *
     * @author ouyangzhenqiang
     * @date 2018/10/29
     * @param receptionId 接待id
     * @return personLnkId link系统中person表中的id
     * @throws Exception 异常信息
     */
    String newPersonFace(String receptionId) throws Exception;

    /**
     * 个体管理入口 - 接收图片资源，进行人脸检测分析、人脸检索、个体创建
     * 当人脸信息接入时，需要提供对应的门店Id信息，以用于识别挂载到哪个门店分组下
     *
     * @author ouyangzhenqiang
     * @date 2018/10/29
     * @param record 优图对象
     *               isCode     是否使用base64编码
     *               param2     预置参数-密钥
     *               storeId    门店id
     *               imgStr     如果使用base64编码方式,传入的人脸图片base64编码
     *               url        如果使用url方式,传入的人脸图片url
     *               imgStr1    如果使用base64编码方式,传入的人身图片base64编码
     *               url1       如果使用url方式,传入的人身图片url
     * @param  tempStore 门店信息
     * @throws Exception 异常信息
     */
    void personcome(YoutuImg record, Store tempStore) throws Exception;

    /**
     * 外部接口token校验
     *
     * @author ouyangzhenqiang
     * @date 2018/12/10
     * @param token
     */
    void safeCheck(String token) throws Exception;

    /**
     * 外部接口门店校验
     *
     * @author ouyangzhenqiang
     * @date 2018/12/10
     * @param storeId
     */
    Store storeCheck(Long storeId) throws Exception;

    /**
     * 外部接口图片资源类型校验
     *
     * @author ouyangzhenqiang
     * @date 2018/12/10
     * @param record
     */
    String codeCheck(YoutuImg record) throws Exception;

    /**
     * 用户在人脸识别接待过程中，综合考虑系统匹配度&人眼识别后，选择提供的可选客户时，需要为选中的person进行人脸更新
     *
     * @author ouyangzhenqiang
     * @date 2018/10/29
     * @param personId    人的id
     * @param receptionId 接待id
     * @throws Exception 异常信息
     */
    void refreshPersonFace(String personId, String receptionId) throws Exception;

}
